﻿/*! \file */
#pragma once
#include "config.h"
#define LOGOG_LEVEL LOGOG_LEVEL_ALL
#include <logog.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/thread.hpp>
#include <Shiny.h>

/*!
 * Funkcja ładująca głowny silnik logów - logog. Musi być wywołana przed wyświetleniem pierwszego loga.
 * @param file ścieżka do pliku logów, np. ClientLib.log
 * @param sout jeśli true logi zostaną także wyświetlone na ekran.
 */
void initLog(const char* file = NULL, bool sout = true);
/*!
 * Funkcja wyłączająca głowny silnik logów - logog. Musi być wywołana podczas zamykania aplikacji.
 */
void shutdownLog();

/**
 *	Klasa pozwalająca na tracking wywołanych funkcji. 
 */
class FunctionLog
{
	private:
		const char* fun;
		const char* file;
		const uint32_t line;
	public:
		/**
		 * Konstruktor tworzący obiek klasy i wywołujący odpowiedni log informujący o wywołaniu funkcji.
		 * @param f nazwa funkcji, najlepiej __PRETTY_FUNCTION__
		 * @param f2 nazwa pliku, najlepiej __FILE__
		 * @param l numer lini, najlepiej __LINE__
		 */
		FunctionLog(const char* f, const char* f2, uint32_t l) : fun(f), file(f2), line(l)
		{
			std::string id = boost::lexical_cast<std::string>(boost::this_thread::get_id());
			LOGOG_DEBUG2(file, line, "ENTER [%s] - %s", id.c_str(), fun);
		}

		/**
		 * Destruktor niszczący obiekt klasy i wywołujący odpowiedni log informujący o wyjściu z funkcji
		 */
		~FunctionLog()
		{
			std::string id = boost::lexical_cast<std::string>(boost::this_thread::get_id());
			LOGOG_DEBUG2(file, line, "LEAVE [%s] - %s", id.c_str(), fun);
		}
};

/**
 * Makro tworzace obiekt klasy FunctionLog na stosie, i informujący profiler o wywołaniu funkcji
 */
#define FUNCTION_TRACK FunctionLog functionTrack(__PRETTY_FUNCTION__, __FILE__, __LINE__);PROFILE_FUNC()
/**
 *	Makro używane do debugowania wyświetlające infomacje o lini.
 */
#define FTRACK DBUG("TRACK - %d", __LINE__);
/**
 *	Makro zamieniające X w boost::shared_ptr< X >
 */
#define PTR(X) boost::shared_ptr< X >
